package task_process

import (
	"context"
	"encoding/json"
	"fmt"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/util/gconv"
	"github.com/gomodule/redigo/redis"
	"github.com/hibiken/asynq"
	"linkable_spider/link"
	"linkable_spider/utils"
)

func ProcessSecondList() error {

	//list, err := utils.GetFirstLevelAllUrlFromRedis()

	conn := g.Redis().Conn()
	defer conn.Close()

	//values := make(map[string]string)

	iter := 0
	for {
		// 使用 HSCAN 命令逐个获取哈希表中的键值对
		reply, err := redis.Values(conn.Do("HSCAN", utils.FIRST_LEVEL_URL, iter, "COUNT", 1))
		if err != nil {
			return err
		}

		// 解析 HSCAN 命令的返回值
		var scanResult []interface{}
		_, err = redis.Scan(reply, &iter, &scanResult)
		if err != nil {
			return err
		}

		// 将键值对添加到 values 中
		for i := 0; i < len(scanResult); i += 2 {
			key, _ := redis.String(scanResult[i], nil)
			value, _ := redis.String(scanResult[i+1], nil)
			//values[key] = value
			fmt.Println("ProcessSecondList : ", key, value)
			errPush := AddListTask(value, utils.Account{})
			utils.RandomSleep()
			if errPush != nil {
				utils.RedisSetItemStatus(value, utils.URL_STATUS_FAIL)
				return errPush
			}

		}

		// 如果迭代器为 0，表示已经遍历完所有键值对，退出循环
		if iter == 0 {
			break
		}

		utils.RandomSleep()

	}
	return nil
	//
	//
	//
	//
	//var value string
	//
	//iter := 0
	//for {
	//	// 使用 HSCAN 命令逐个获取哈希表中的键值对
	//	reply, err := redis.Values(conn.Do("HSCAN", utils.FIRST_LEVEL_URL, iter))
	//	if err != nil {
	//		return err
	//	}
	//
	//	// 解析 HSCAN 命令的返回值
	//	_, err = redis.Scan(reply, &iter, &value)
	//	if err != nil {
	//		return err
	//	}
	//
	//	fmt.Println("ProcessSecondList : ", iter)
	//	fmt.Println("ProcessSecondList : ", value)
	//
	////fmt.Println("ProcessSecondList : ", i, element)
	//errPush := AddListTask(values, utils.Account{})
	//if errPush != nil {
	//	utils.RedisSetItemStatus(element, utils.URL_STATUS_FAIL)
	//	return errPush
	//}
	//
	//
	//	// 如果迭代器为 0，表示已经遍历完所有键值对，退出循环
	//	if iter == 0 {
	//		break
	//	}
	//}
	//
	//return nil

}

func AddListTask(url string, account utils.Account) error {
	text, _ := json.Marshal(account)

	return AddTaskToQueue(LINKABLE_TASK_TYPE_LIST, g.Map{"list_url": url, "account": gconv.String(text)}, 0)
}

func ProcessDealList(c context.Context, t *asynq.Task) error {
	url, _ := t.Payload.GetString("list_url")
	text, _ := t.Payload.GetString("account")

	var acc utils.Account
	json.Unmarshal([]byte(text), &acc)

	urls, secondUrls, account, err := link.SecondLevelList(url, &acc)

	if err != nil {
		//登录失败重新请求任务
		AddListTask(url, utils.Account{})
	}

	for _, element := range urls {
		errPush := AddDetailTask(element)
		if errPush != nil {
			//utils.RedisSetItemStatus(element, utils.URL_STATUS_FAIL)
			return errPush
		}
	}

	for _, element := range secondUrls {
		errPush := AddListTask(element, *account)
		if errPush != nil {
			//utils.RedisSetItemStatus(element, utils.URL_STATUS_FAIL)
			return errPush
		}
	}
	return nil
}

func AddDetailTask(url string) error {
	//
	//text, _ := json.Marshal(account)
	//
	//return AddTaskToQueue(LINKABLE_TASK_TYPE_ARTICLE, g.Map{"article_url": url, "account": gconv.String(text)}, 0)
	return AddTaskToQueue(LINKABLE_TASK_TYPE_ARTICLE, g.Map{"article_url": url}, 0)

}

func ProcessDealArticle(c context.Context, t *asynq.Task) error {
	url, _ := t.Payload.GetString("article_url")
	//text, _ := t.Payload.GetString("account")
	//
	//var account utils.Account
	//json.Unmarshal([]byte(text), &account)
	//
	err := link.GetDetail(url)
	if err != nil {
		//如果出错就清空任务重的账号那个参数
		AddDetailTask(url)
		return err
	}
	return nil
}
